;
INCLUDE				PIOC_INC.ASM
;
;
					ORG   0X0000
					DW    0X0000
					JMP   MCU_START
					DW    0X0FFF
;
IIC_TIM_FREQ		EQU   SFR_DATA_REG0
IIC_TIM_ARR			EQU   SFR_DATA_REG1
IIC_ADDR_L			EQU   SFR_DATA_REG2
IIC_ADDR_H			EQU   SFR_DATA_REG3
VAR_SIZE_L			EQU   SFR_DATA_REG4
VAR_SIZE_H			EQU   SFR_DATA_REG5
IIC_FLAG			EQU   SFR_DATA_REG6
IIC_VAR			    EQU   SFR_DATA_REG7
IIC_DATA			EQU   SFR_DATA_REG8
;
IIC_SLAVE_BUF		EQU   SFR_DATA_REG24
;
CLK_10:				NOP
					NOP
					NOP
					NOP
					NOP
					NOP
					RET
;
DELAY_US:			CALL  CLK_10
					NOP
					CALL  CLK_10
					NOP
					CALL  CLK_10
					NOP
					CALL  CLK_10
					NOP
					ADDL  0XFF
					NOP
					JNZ   DELAY_US
					RET
;
TIM_INIT:			MOV   IIC_TIM_ARR,A
					MOVA  SFR_TMR0_INIT
					MOV   IIC_TIM_FREQ,A
					MOVA  SFR_TIMER_CTRL
					RET
;
IIC_HOST:			WAITB  WB_DATA_MW_SR_1
					MOV   SFR_CTRL_WR,A
					BS    SFR_PORT_IO,SB_PORT_OUT0
					BS    SFR_PORT_IO,SB_PORT_OUT1
					MOVA1F  0B00001111
					BC    SFR_STATUS_REG,SB_GP_BIT_X
					BC    SFR_STATUS_REG,SB_GP_BIT_Y
					BTSC  IIC_FLAG,1
					BS    SFR_STATUS_REG,SB_GP_BIT_Y
					MOVL  0X08
					MOVA  IIC_VAR
					MOVIA IIC_DATA
					CALL  TIM_INIT
SR:					MOVL  0X05
					CALL  DELAY_US
					BC    SFR_PORT_IO,SB_PORT_OUT1
					MOVL  0X05
					CALL  DELAY_US
					MOV   IIC_TIM_ARR,A
					MOVA  SFR_TMR0_COUNT
					BS    SFR_TIMER_CTRL,SB_TMR0_ENABLE
					BS    SFR_TIMER_CTRL,SB_TMR0_OUT_EN
					MOV   IIC_ADDR_H,A
					MOVA  SFR_DATA_EXCH
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,7
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,6
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,5
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,4
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,3
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,2
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,1
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BTSC  SFR_STATUS_REG,SB_GP_BIT_Y
					BC    SFR_DATA_EXCH,0
					BP2F  BO_PORT_OUT1,0
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					BCTC  BI_PORT_IN1
					JC    HOST_STOP
					BTSS  SFR_STATUS_REG,SB_GP_BIT_Y
					JMP   HOST_R_W
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					MOV   IIC_ADDR_L,A
					MOVA  SFR_DATA_EXCH
					BP2F  BO_PORT_OUT1,7
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,6
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,5
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,4
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,3
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,2
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,1
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,0
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					BCTC  BI_PORT_IN1
					JC    HOST_STOP
					BTSS  IIC_ADDR_H,0
					JMP   HOST_WRITE_BYTE
					WAITB WB_PORT_XOR0_1
					BS    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					BC    SFR_PORT_IO,SB_PORT_OUT0
					BC    SFR_TIMER_CTRL,SB_TMR0_ENABLE
					BC    SFR_TIMER_CTRL,SB_TMR0_OUT_EN
					MOVL  0X01
					CALL  DELAY_US
					BS    SFR_TIMER_CTRL,SB_TMR0_ENABLE
					BS    SFR_TIMER_CTRL,SB_TMR0_OUT_EN
					BS    SFR_PORT_IO,SB_PORT_OUT0
					WAITB WB_PORT_XOR0_0
					BC    SFR_TIMER_CTRL,SB_TMR0_ENABLE
					BC    SFR_TIMER_CTRL,SB_TMR0_OUT_EN
					BC    SFR_STATUS_REG,SB_GP_BIT_Y
					JMP   SR
					;
HOST_R_W:			BTSS  SFR_DATA_EXCH,0
					JMP   HOST_WRITE_BYTE
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT0
					BC    SFR_TIMER_CTRL,SB_TMR0_ENABLE
					BC    SFR_TIMER_CTRL,SB_TMR0_OUT_EN
					MOVL  0X0B
					CALL  DELAY_US
					BS    SFR_TIMER_CTRL,SB_TMR0_ENABLE
					BS    SFR_TIMER_CTRL,SB_TMR0_OUT_EN
					BS    SFR_PORT_IO,SB_PORT_OUT0
HOST_READ_BYTE:		WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,7
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,6
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,5
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,4
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,3
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,2
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,1
					WAITB WB_PORT_XOR0_1
					DEC   VAR_SIZE_L
					INC   VAR_SIZE_L,A
					BTSC  SFR_STATUS_REG,SB_FLAG_Z
					DEC   VAR_SIZE_H
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,0
					MOV   VAR_SIZE_L,A
					IOR   VAR_SIZE_H,A
					JZ    HOST_READ_STOP
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					MOV   SFR_DATA_EXCH,A
					MOVA  SFR_INDIR_PORT2
					WAITB WB_PORT_XOR0_0
					DEC   IIC_VAR
					JNZ   HOST_READ_BYTE
					BTSC  SFR_STATUS_REG,SB_GP_BIT_X
					MOVIA IIC_DATA
					MOVL  0X02
					XOR   SFR_STATUS_REG
					MOVL  0X08
					MOVA  IIC_VAR
					BS    SFR_SYS_CFG,SB_INT_REQ
					JMP   HOST_READ_BYTE
HOST_READ_STOP:		WAITB WB_PORT_XOR0_1
					BS    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					MOV   SFR_DATA_EXCH,A
					MOVA  SFR_INDIR_PORT2
					WAITB WB_PORT_XOR0_0
					BS    SFR_SYS_CFG,SB_INT_REQ
					JMP   HOST_STOP
HOST_WRITE_BYTE:	WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					MOV   SFR_INDIR_PORT2,A
					MOVA  SFR_DATA_EXCH
					BP2F  BO_PORT_OUT1,7
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					CALL  CLK_10
					BP2F  BO_PORT_OUT1,6
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,5
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,4
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,3
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,2
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,1
					WAITB WB_PORT_XOR0_0
					DEC   IIC_VAR
					JNZ   HOST_WRITE_1
					BTSC  SFR_STATUS_REG,SB_GP_BIT_X
					MOVIA IIC_DATA
					MOVL  0X02
					XOR   SFR_STATUS_REG
					MOVL  0X08
					MOVA  IIC_VAR
					BS    SFR_SYS_CFG,SB_INT_REQ
HOST_WRITE_1:		WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,0
					WAITB WB_PORT_XOR0_0
					DEC   VAR_SIZE_L
					INC   VAR_SIZE_L,A
					BTSC  SFR_STATUS_REG,SB_FLAG_Z
					DEC   VAR_SIZE_H
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
;					CALL  CLK_10
					BCTC  BI_PORT_IN1
					JC    HOST_STOP
					MOV   VAR_SIZE_L,A
					IOR   VAR_SIZE_H,A
					JZ    HOST_STOP
					JMP   HOST_WRITE_BYTE
HOST_STOP:			WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					BC    SFR_TIMER_CTRL,SB_TMR0_ENABLE
					BC    SFR_TIMER_CTRL,SB_TMR0_OUT_EN
					MOVL  0X01
					CALL  DELAY_US
					BS    SFR_PORT_IO,SB_PORT_OUT1
					JMP   IIC_HOST
;
IIC_SLAVE:
					BC    SFR_STATUS_REG,SB_GP_BIT_X
					BC    SFR_STATUS_REG,SB_GP_BIT_Y
					MOVIA IIC_DATA
					BS    SFR_PORT_IO,SB_PORT_OUT0
					BS    SFR_PORT_IO,SB_PORT_OUT1
					MOVA1F  0B00001100
SLAVE_1:			WAITB WB_PORT_XOR0_0
					BCTC  BI_PORT_IN1
					JNC   SLAVE_1
					WAITB WB_PORT_XOR1_1
					CALL  CLK_10
					BCTC  BI_PORT_IN0
					JNC   SLAVE_1
					MOVL  0X08
					MOVA  IIC_VAR
					BC    IIC_ADDR_H,0
SLAVE_2:			WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,7
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,6
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,5
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,4
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,3
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,2
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,1
					BC    SFR_DATA_EXCH,0
					MOV   SFR_DATA_EXCH,A
					XOR   IIC_ADDR_H,A
					JNZ   IIC_SLAVE
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,0
					BTSC  SFR_STATUS_REG,SB_GP_BIT_Y
					JMP   SLAVE_6
					BTSS  SFR_DATA_EXCH,0
					JMP   SLAVE_3

					;FA_7
					BTSC  IIC_FLAG,1
					JMP   IIC_SLAVE
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					JMP   SLAVE_TRANSMIT
SLAVE_3:			BTSC  IIC_FLAG,1
					JMP   SLAVE_4
					;SHOU_7
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					JMP   SLAVE_RECEIVE
SLAVE_4:			WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,7
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,6
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,5
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,4
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,3
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,2
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,1
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,0
					MOV   SFR_DATA_EXCH,A
					XOR   IIC_ADDR_L,A
					JNZ   IIC_SLAVE
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,7
;					BS    IIC_ADDR_H,0
					BCTC  BI_PORT_IN1
					JNC   SLAVE_RECEIVE_2
SLAVE_5:			BTSS  SFR_PORT_IO,SB_PORT_IN_XOR
					JMP   SLAVE_5
					BCTC  BI_PORT_IN0
					JNC   SLAVE_RECEIVE_4
					BS    SFR_STATUS_REG,SB_GP_BIT_Y
					JMP   SLAVE_2
SLAVE_6:			BTSS  SFR_DATA_EXCH,0
					JMP	  IIC_SLAVE
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					JMP   SLAVE_TRANSMIT


SLAVE_RECEIVE:		BS    IIC_ADDR_H,0
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,7
					BCTC  BI_PORT_IN1
					JC    SLAVE_RECEIVE_3
					CALL  CLK_10
SLAVE_RECEIVE_1:	BTSC  SFR_PORT_IO,SB_PORT_IN_XOR
					JMP   SLAVE_RECEIVE_1
;					CALL  CLK_10
					BCTC  BI_PORT_IN0					
					JNC   SLAVE_RECEIVE_4
					BS    IIC_FLAG,2
					BS    SFR_SYS_CFG,SB_INT_REQ
					JMP   IIC_SLAVE
SLAVE_RECEIVE_2:	BS    IIC_ADDR_H,0
SLAVE_RECEIVE_3:	WAITB WB_PORT_XOR0_1
SLAVE_RECEIVE_4:	WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,6
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,5
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,4
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,3
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,2
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,1
					WAITB WB_PORT_XOR0_1
					WAITB WB_PORT_XOR0_0
					BG2F  BI_PORT_IN1,0
					MOV   SFR_DATA_EXCH,A
					MOVA  SFR_INDIR_PORT2
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_IO,SB_PORT_OUT1
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					DEC   IIC_VAR
					JNZ   SLAVE_RECEIVE
					BTSC  SFR_STATUS_REG,SB_GP_BIT_X
					MOVIA IIC_DATA
					MOVL  0X02
					XOR   SFR_STATUS_REG
					MOVL  0X08
					MOVA  IIC_VAR
					BS    SFR_SYS_CFG,SB_INT_REQ
					JMP   SLAVE_RECEIVE
					
SLAVE_TRANSMIT:		BC    IIC_ADDR_H,0
					BS    SFR_SYS_CFG,SB_INT_REQ
					MOVIA IIC_SLAVE_BUF
					BS    SFR_STATUS_REG,SB_GP_BIT_X
SLAVE_TRANSMIT_1:	WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					CLRA
					IOR   SFR_INDIR_PORT2,A
					MOVA  SFR_DATA_EXCH
					CLR   SFR_INDIR_PORT2
					MOV   SFR_INDIR_PORT2,A
					BP2F  BO_PORT_OUT1,7
					BS    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,6
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1			
					BP2F  BO_PORT_OUT1,5
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,4
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,3
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,2
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,1					
					WAITB WB_PORT_XOR0_0
					DEC   IIC_VAR
					JNZ   SLAVE_TRANSMIT_2
					BTSC  SFR_STATUS_REG,SB_GP_BIT_X
					MOVIA IIC_DATA
					MOVL  0X02
					XOR   SFR_STATUS_REG
					MOVL  0X08
					MOVA  IIC_VAR
					BS    SFR_SYS_CFG,SB_INT_REQ
SLAVE_TRANSMIT_2:	WAITB WB_PORT_XOR0_1
					BP2F  BO_PORT_OUT1,0
					WAITB WB_PORT_XOR0_0
					WAITB WB_PORT_XOR0_1
					BC    SFR_PORT_DIR,SB_PORT_DIR1
					WAITB WB_PORT_XOR0_0
					BCTC  BI_PORT_IN1
					JNC   SLAVE_TRANSMIT_1
					BS    IIC_FLAG,2
					BS    SFR_SYS_CFG,SB_INT_REQ
					JMP   IIC_SLAVE


MCU_START:			NOP
					NOP
					WAITB  WB_DATA_MW_SR_1
					BTSS  IIC_FLAG,0
					JMP   IIC_SLAVE
					JMP   IIC_HOST
					JMP   MCU_START
;
HHH:				JMP   HHH
;
;
END
;

